// 1. Promise是一个构造函数，既然是构造函数，那么，我们就可以 new Promise（）得到Promise的实例
// 2.在 PromLse上，有两个函数，分别叫做 resolve（成功之后的回调函数）和 reject（失败之后的回调函数）
// 3.在 Promise构造函数的 Prototype属性上，有一个.then（）方法，也就说，只要是Prom⊥se构造函数创建的实例，都可以访问到.then（）方法
// 4. Promse表示一个异步操作；每当我们new一个 Pronise的实例，这个实例，就表示一个具体的异步操作
// 5.既然 Promise创建的实例，是一个异步操作，那么，这个异步操作的结果，只能有两种状态
//  5.1状态1：异步执行成功了，需要在内部调用成功的回调函数xea01ve把结
//  5.2状态2：异步执行失败了，需要在内部调用失败的回调函数 reject把结果返回给调用者
//  5.3由于 Promise的实例，是一个异步操作，所以，内部拿到操作的结果后，无法使用 return把操作的结果返回给调用者这时候，只能使用回调函数的形式，来把成功或失败的结果，返回给调用者
// 6.我们可以在new出来的 Promise实例上，调用then（）方法，【预先】为这个 PromIse异步操作，指定成功（ resolve）和失败（ reject）回调函数


//注意：这里new出来的 promise，只是代表[形式上]的一个异步操作
// 什么是形式上的异步操作：就是说，我们只知道它是一个异步操作，但是做什么具体的异步事情，目前还不清楚
//  var promise = new Promise（）
//这是一个具体的异生操作，其中，使用 function指定一个具体的异步操作

// var promise = new Promise(function(){
//     //这个 function内部写的就是具体的异步操作！

// })


const fs = require('fs')

// 每当new 一个Promise实例的时候，就会立即执行这个异步操作中的代码
// 也就是说，new的时候，除了能够得到一个 promise实例之外，还会立即调用我们为 Promise构造函数传递的那个 function，执行这个 function中的异步操作代码


/* var promise = new Promise(
    function(){
        fs.readFile('./files/1.txt','utf-8',(err,dataStr)=>{
            // if(err) throw err
            // 如果报错，进入if分支后，if后面的代码就没有必要执行了
            if(err) throw err
            console.log(dataStr)
        })
    }
) */



//初衷：给路径，返回读取到的内容
function getFileByPath(fpath){
    var promise = new Promise(
        function(resolve,reject){
            fs.readFile(fpath,'utf-8',(err,dataStr)=>{
                // if(err) throw err
                // 如果报错，进入if分支后，if后面的代码就没有必要执行了
                // if(err) throw err
                // console.log(dataStr)
                if(err) return reject(err)
                resolve(dataStr)
            })
        }
    )

    return promise
}

var p = getFileByPath('./files/2.txt')

p.then(function(data){
    console.log(data+'------')
},function(err){
    console.log(err+'------')
})



